package objetos;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;





public class Arvores extends Sprite{

	public double x;
	public double y;

	int contY=0;
	
	ArrayList<Arvores> listaDeArvores = new ArrayList<Arvores>();
	
	ArrayList<Ponto> arrayLines = new ArrayList<Ponto>();
	
	ArrayList<Integer> larguraGalhos = new ArrayList<Integer>();

	ArrayList<Boolean> verificaColicoes = new ArrayList<Boolean>();

	public int evento, modoEvento;
	
	public double inicioX, inicioY;

	boolean colidiu;
	

	int bx, by;

	float oldX, oldY;

	long diftimeColicao;

	BufferedImage imagem;

	public Arvores() {


	}


	public void addArvore(double x, double y, int evento, int modoEvento, int profundidade, int tamanho,double theta,int larguraRamo){
		Arvores novaArvore = new Arvores();
		novaArvore.x = x;
		novaArvore.y = y;
		novaArvore.inicioX = x;
		novaArvore.inicioY = y;
		novaArvore.evento = evento;
		novaArvore.modoEvento = modoEvento;
		novaArvore.imagem = CanvasGame.instance.imagemBoxPush;
		
		fazendoArvores(profundidade, x, y, tamanho, theta, larguraRamo);

		listaDeArvores.add(novaArvore);

		novaArvore = null;
	}

	@Override
	public void SimulaSe(long diftime) {

		diftimeColicao = diftime;

	}

	
	
	public void fazendoArvores(int profundidade, double x,double  y,int tamanho,double  theta,int branchWidth){
		
            if (profundidade < 0){
            	
            }else{

            double rand = Math.random();
            double maxAngle = Math.PI / 2;
            double x2 = x + tamanho * Math.cos(theta);
            double y2 = y + tamanho * Math.sin(theta);

           fazendoLinhas(x, y, x2, y2, branchWidth);

            double subBranches = Math.random() * 2 + 1;
            for (int i = 0; i < subBranches; i++) {
                fazendoArvores(
                    (int)(profundidade - 1),
                    x2, y2,
                    (int)(tamanho * (0.7 + Math.random() * 0.3)),
                    (int)(theta + Math.random() * maxAngle - 0.5 * maxAngle),
                    (int)(branchWidth * 0.7)
                    );
            }
            
            }
        
	}
            
	
	
	
	public void fazendoLinhas(double x1,double y1,double x2,double y2,int pen){
			
		    if(listaDeArvores.size() > 0){
		    for(int i = listaDeArvores.size()-1; i < listaDeArvores.size(); i++){
				
		    	//System.out.println(" i >> "+i);
		    	Ponto p = new Ponto();
				p.x = x1;
				p.y = 600 - y1;
				listaDeArvores.get(i).arrayLines.add(p);
				listaDeArvores.get(i).larguraGalhos.add(pen);
			    
			    Ponto p2 = new Ponto();
				p2.x = x2;
				p2.y = 600 - y2;
				listaDeArvores.get(i).arrayLines.add(p2);
				listaDeArvores.get(i).larguraGalhos.add(pen);
		
			    p = null;
			    p2 = null;
			    
		    }
		    
		    }
			    
                // moveTo(x1, this.canvasHeight - y1);
                // lineTo(x2, this.canvasHeight - y2);
     
	}
	
	
	
	@Override
	public void DesenhaSe(Graphics2D dbg, int mapx, int mapy) {

	  
		for (int i = 0; i < listaDeArvores.size(); i++) {

			for (int j=0; j < listaDeArvores.get(i).arrayLines.size(); j++) {
				if(j < listaDeArvores.get(i).arrayLines.size()-1){
					dbg.setColor(Color.BLACK);
					dbg.setStroke(new BasicStroke(listaDeArvores.get(i).larguraGalhos.get(j)));  
					dbg.drawLine((int)(listaDeArvores.get(i).arrayLines.get(j).x - mapx),(int)(listaDeArvores.get(i).arrayLines.get(j).y - mapy),(int)(listaDeArvores.get(i).arrayLines.get(j+1).x - mapx),(int)(listaDeArvores.get(i).arrayLines.get(j+1).y - mapy));
					
				}
			}
			
		}

	}

	public void colisaoRetangular(Heroi p) {

		int cont =0;

		for (int i = 0; i < listaDeArvores.size(); i++) {	

			if(listaDeArvores.get(i).modoEvento >= 1 || listaDeArvores.get(i).evento <= 0){		

				if(listaDeArvores.get(i).modoEvento >= 1 || listaDeArvores.get(i).evento <= 0){
					colidiu = true;	

					if (p.X + 32 < listaDeArvores.get(i).x) {
						colidiu = false;
					}
					if (p.X > listaDeArvores.get(i).x + 40) {
						colidiu = false;
					}
					if (p.Y + 48 < listaDeArvores.get(i).y) {
						colidiu = false;
					}
					if (p.Y > listaDeArvores.get(i).y + 40) {
						colidiu = false;
					}


					if(colidiu == true){
						if(CanvasGame.instance.heroi.Y < listaDeArvores.get(i).y -15){
							if(Y <  listaDeArvores.get(i).y){
								CanvasGame.instance.heroi.Y = (float)(listaDeArvores.get(i).y - 48);
							}
						}else{
//							if(CanvasGame.instance.heroi.X > listaDeArvores.get(i).x + 10){
//								listaDeArvores.get(i).x -= CanvasGame.instance.heroi.velocidade * diftimeColicao / 1000.0f;
//							}else if(CanvasGame.instance.heroi.X < listaDeArvores.get(i).x){
//								listaDeArvores.get(i).x += CanvasGame.instance.heroi.velocidade * diftimeColicao / 1000.0f;
//							}
						}

					}

					cont++;

				}
			}
		}

	}


	public boolean colisaoRetangular(double tempX, double tempY) {


		int cont =0;

		for (int i = 0; i < listaDeArvores.size(); i++) {	

			if(listaDeArvores.get(i).modoEvento >= 1 || listaDeArvores.get(i).evento <= 0){
				colidiu = true;	

				if (tempX + 32 < listaDeArvores.get(i).x) {
					colidiu = false;
				}
				if (tempX > listaDeArvores.get(i).x + 40) {
					colidiu = false;
				}
				if (tempY + 48 < listaDeArvores.get(i).y) {
					colidiu = false;
				}
				if (tempY > listaDeArvores.get(i).y + 40) {
					colidiu = false;
				}


				if(colidiu == true){
					x = listaDeArvores.get(i).x;
					y = listaDeArvores.get(i).y;
					return true;
				}

				cont++;

			}
		}


		if(colidiu == false){
			return false;
		}else{
			return true;

		}
	}


}
